oracle的序列重置值有两种方法:
假设现有表 T_test 对应主键的sequence为seq_test_id
方法一:重建sequence:
删除序列seq_test_id,然后重新新建序列seq_test_id,将新序列seq_test_id的start with值改为一个合适的num,可以直接使用下面这个函数来实现。
create or replace function SF_SET_SEQ_NEXTVAL(vcSeqName in varchar2, lNextVal in number) return number is
/* ===========================================================================
* 函 数 名:sf_set_seq_nextval
* ===========================================================================
select u.increment_by, u.min_value, u.max_value,
u.cycle_flag, u.order_flag, u.cache_size
into lIncVal, lMinVal, lMaxVal, cCycle, cOrder, lCache
where u.sequence_name = upper(vcSeqName);
if cCycle = 'N' then sCycle := 'nocycle'; else sCycle := 'cycle'; end if;
if cOrder = 'N' then sOrder := 'noorder'; else sOrder := 'order'; end if;
sCache := 'cache '||lCache;
sTemp := 'drop sequence '||vcSeqName;
sTemp := 'create sequence '||vcSeqName||
' start with '||lNextVal||
' increment by '||lIncVal||
' '||sCycle||' '||sOrder||' '||sCache||'';
方法二:设置increment参数值
通过设置sequence的increment参数值,加上一个负数/正数,以达到修改sequence的值目的,修改完之后再将increment参数值恢复。
执行如下sql:
p_seqName := 'SEQENTRUSTNO';--修改这里的sequence名称
EXECUTE IMMEDIATE 'SELECT ' || p_seqName || '.NEXTVAL FROM dual ' INTO n;
tsql := 'alter sequence '|| p_seqName ||' increment by ' || n; --修改increment参数
EXECUTE IMMEDIATE 'SELECT ' || p_seqName || '.NEXTVAL FROM dual ' INTO n;
tsql := 'alter sequence '|| p_seqName ||' increment by 1' ; --恢复increment参数值